import json
import os
import shutil

from functools import wraps

__all__ = ['tmp', 'clean_tmp', 'txt_import', 'words_set', 'mat_avg']


def tmp(func):
    """
    为函数func的输出提供硬盘缓存， 缓存文件为"./tmp"下与函数同名的json文件。

    :param func: 需要被缓存结果的函数
    :return: 被修饰过的函数 
    """

    @wraps(func)
    def memorize(*arg, **kwrgs):
        """
        尝试从tmp文件夹中读取已存在的数据，无缓存时运行函数并缓存结果。

        :param: 接受任意参数
        :return: 缓存数据或运行结果
        """

        path = "./tmp/{}.json".format(func.__name__)

        if os.path.exists(path):
            with open(path, "r") as f:
                s = json.load(f)
        else:
            s = func(*arg, **kwrgs)
            with open(path, "w") as f:
                json.dump(s, f)
        return s

    return memorize


def clean_tmp():
    """
    清理缓存
    缓存目录：./tmp
    """

    ans = input("是否清除缓存? 输入Y清除，默认不清除。")
    if ans == 'Y':
        shutil.rmtree("./tmp")
        os.mkdir("./tmp")
        print("缓存已清除。")
    else:
        print("缓存未清除。")


def txt_import(path):
    """
    导入文本，按行分割

    :param path: 文本路径
    :return: 各行文本组成的列表
    """

    with open(path, "r", encoding='utf8') as f:
        s = f.read()
        lines = s.splitlines()
        data = [line.split("\t") for line in lines]

    return data


def words_set(path):
    """
    用于词表分词，文件的每行应为一个词语
    常用于停用词表的导入

    :param path: 单词集路径
    :return : 单词集（集合）
    """

    stoplist = txt_import(path)
    stopset = {word[0] for word in stoplist}

    return stopset


def mat_avg(num_list):
    """
    求矩阵的行均值向量。

    :param num_list: 二维数值列表，行主序
    :return: 非空矩阵的行均值向量
    """

    n = len(num_list)  # 矩阵列数
    if n != 0:
        result = []
        for i in range(5):
            result.append(sum([x[i] for x in num_list]) / n)
        return result
